avatar

目录
python uv functionality

UV是一个现代化、高性能的Python包管理器和安装工具,由Rust语言编写2。它被设计为传统Python包管理工具(如pip)的直接替代品,提供显著的速度、可靠性和依赖解析改进2

UV的主要特点

  • 极快的性能:比传统包管理器快10-100倍,特别是在大型项目中24

  • 内存效率高:在包安装和依赖解析过程中使用明显更少的内存2

  • 集成环境管理:结合了包管理和虚拟环境创建功能于一体2

  • 兼容性:与现有Python工具和工作流程完全兼容24

  • 可靠的依赖锁定:确保跨不同系统的一致环境2

UV与其他工具的比较

与pip和virtualenv相比,UV提供了:

  • 更快的包安装和依赖解析速度

  • 集成的环境管理功能

  • 更清晰的错误信息和更好的冲突解决能力

  • 更好的可重现性2

UV的主要功能

包管理

  • uv pip install:安装包

  • uv pip compile:锁定依赖

  • uv pip sync:同步环境4

虚拟环境管理

  • uv venv:创建虚拟环境

  • uv sync:同步环境与项目依赖68

工具运行

UV提供了两种特殊接口来管理命令行工具:

  1. uv tool run:运行Python包提供的命令

  2. uvxuv tool run的便捷别名23

这些命令在UV缓存中创建临时虚拟环境,安装并运行请求的工具,无需将它们安装到项目的虚拟环境中237

全局工具安装

  • uv tool install:将Python包作为命令行工具安装到全局环境35

  • uv tool upgrade:升级已安装的工具

  • uv tool uninstall:卸载工具3

UV代表了Python包管理的新一代工具,旨在解决Python生态系统中的常见痛点,如安装时间慢、依赖冲突和环境管理复杂性2。它作为一个统一且模块化的工具,可以替代多个传统工具,简化Python开发工作流程4

Citations

  1. https://github.com/camel-ai/owl.git
  2. https://www.datacamp.com/tutorial/python-uv
  3. https://docs.astral.sh/uv/reference/cli/
  4. https://astral.sh/blog/uv
  5. https://mathspp.com/blog/using-uv-to-build-and-install-python-cli-apps
  6. https://www.saaspegasus.com/guides/uv-deep-dive/
  7. https://docs.astral.sh/uv/guides/tools/
  8. https://flocode.substack.com/p/044-python-environments-again-uv

Answer from Perplexity: pplx.ai/share

他什么时候开始流行的? 是不是语法和pip一样?

UV于2024年2月中旬首次发布,作为pip和pip-tools的替代品2。自发布以来,它迅速获得了广泛的流行,截至2024年中期,每月下载量已达到1600万次,占PyPI请求的10%以上5。到2025年初,UV已经成为Python社区中广受推崇的包管理工具,许多开发者开始从pip迁移到UV13

UV的语法设计为与pip兼容,大多数常见的pip命令可以直接替换使用。例如,可以将pip install替换为uv pip install4。UV被设计为pip和pip-tools工作流程的”直接替代品”,这意味着现有的pip用户可以在不对其包管理工作流程进行重大更改的情况下切换到UV4

然而,UV并不是pip的完全克隆,它不支持pip的所有命令行选项和子命令,尽管它支持大部分常用功能4。此外,UV不读取pip特定的配置文件或环境变量(如pip.conf或PIP_INDEX_URL),而是使用自己的环境变量(如UV_INDEX_URL)和配置文件(uv.toml或pyproject.toml中的[tool.uv.pip]部分)4

在处理某些特定情况时,UV和pip也有一些行为差异,例如在处理存在于多个索引上的包时,UV会按顺序迭代索引并在找到匹配项后停止搜索,而pip会合并所有索引中的候选版本4

Citations

  1. https://blog.det.life/changing-package-manager-from-pip-to-uv-81ac3b5a037d
  2. https://astral.sh/blog/uv
  3. https://www.datacamp.com/tutorial/python-uv
  4. https://docs.astral.sh/uv/pip/compatibility/
  5. https://www.janestreet.com/tech-talks/uv-an-extremely-fast-python-package-manager/
  6. https://astral.sh/blog/uv-unified-python-packaging
  7. https://dev.to/astrojuanlu/python-packaging-is-great-now-uv-is-all-you-need-4i2d
  8. https://thedataquarry.com/blog/towards-a-unified-python-toolchain
  9. https://www.reddit.com/r/Python/comments/1aroork/announcing_uv_python_packaging_in_rust/
  10. https://news.ycombinator.com/item?id=42676432

Answer from Perplexity: pplx.ai/share

Uv怎么管理包? 是不是也是用requirements.txt或者pyproject.toml

UV是一个现代化的Python包管理器,它支持两种主要的依赖管理方式:传统的requirements.txt和更现代的pyproject.toml。

UV的依赖管理方式

使用pyproject.toml(推荐方式)

UV主要使用pyproject.toml作为项目的配置文件,这是一个符合PEP 621标准的现代Python项目配置方式5。当使用UV管理项目时:

  • pyproject.toml文件定义项目的主要依赖关系(类似于pip-tools中的requirements.in)

  • UV自动创建和维护uv.lock文件,记录所有依赖的精确版本(类似于requirements.txt的作用)58

使用pyproject.toml的基本工作流程:

bash

# 初始化项目 uv init myproject cd myproject # 添加依赖 uv add requests pandas # 同步环境(其他开发者克隆项目后使用) uv sync

使用requirements.txt(兼容传统方式)

UV完全兼容传统的requirements.txt文件,可以直接使用以下命令安装依赖47

bash

# 安装requirements.txt中的依赖 uv pip install -r requirements.txt

从requirements.txt迁移到pyproject.toml

如果你想从传统的requirements.txt迁移到现代的pyproject.toml,UV提供了简便的迁移方式7

bash

# 初始化项目 uv init --no-sample # 导入现有requirements.txt uv add -r requirements.txt # 导入开发依赖 uv add --dev -r requirements-dev.txt

UV的依赖管理特点

  1. 自动环境管理:UV自动创建和管理虚拟环境,无需手动激活3

  2. 跨平台锁文件:uv.lock文件是跨平台的,确保在不同操作系统和Python版本上安装一致的依赖58

  3. 高效缓存系统:UV使用全局缓存来最小化冗余,确保相同的包只存储一次,无论有多少项目需要它6

  4. 环境同步uv sync命令会比较当前环境与依赖文件的差异,安装缺失的依赖,升级/降级版本,删除不需要的包6

UV代表了Python包管理的新一代工具,旨在解决传统包管理的痛点,如安装速度慢、依赖冲突和环境管理复杂等问题,同时保持与现有Python工具和工作流程的兼容性。

Citations

  1. https://www.datacamp.com/tutorial/python-uv
  2. https://paiml.com/blog/2024-12-01-uv-architecture/
  3. https://pydevtools.com/blog/requirementstxt-vs-pyprojecttoml/
  4. https://stackoverflow.com/questions/79344035/how-to-add-requirements-txt-to-uv-environment
  5. https://www.saaspegasus.com/guides/uv-deep-dive/
  6. https://flocode.substack.com/p/044-python-environments-again-uv
  7. https://pydevtools.com/handbook/how-to/migrate-requirements.txt/
  8. https://docs.astral.sh/uv/concepts/projects/layout/
  9. https://www.youtube.com/watch?v=JtR7EyMcaWU
  10. https://www.janestreet.com/tech-talks/uv-an-extremely-fast-python-package-manager/
  11. https://www.reddit.com/r/learnpython/comments/1j2bg8e/utility_to_convert_requirementstxt_to_uv/

Answer from Perplexity: pplx.ai/share

那我用UV运行程序和用venv有什么不一样? 实际命令的区别

使用UV运行Python程序与传统的venv方式相比有几个关键区别。

环境创建和管理

创建虚拟环境

  • UV方式uv venv [PATH]uv venv --python 3.12

  • 传统venv方式python -m venv [PATH]virtualenv -p python3.12 [PATH]

UV创建虚拟环境更快,并且如果指定的Python版本不存在,UV会自动下载安装该版本24

安装依赖

  • UV方式uv pip install <packages>uv add <packages>

  • 传统方式pip install <packages>

UV的安装速度比传统pip快10-100倍,特别是在大型项目中1

运行程序

直接运行脚本

  • UV方式uv run hello.py

  • 传统方式python hello.py (需要先激活环境:source .venv/bin/activate)

UV不需要手动激活虚拟环境就能运行脚本,它会自动检测和使用项目目录或父目录中的.venv环境15

运行工具和命令

  • UV方式uv tool run black hello.py 或更简洁的 uvx black hello.py

  • 传统方式:需要先激活环境,然后直接运行 black hello.py

UV的工具运行机制会在缓存中创建临时虚拟环境,安装并运行请求的工具,无需将它们安装到项目的虚拟环境中1

环境同步

  • UV方式uv sync 会比较当前环境与依赖文件的差异,安装缺失的依赖

  • 传统方式pip install -r requirements.txt 只会安装文件中的依赖,不会移除多余的包

自动化特性

UV提供了更多自动化功能:

  • 自动创建虚拟环境(当添加第一个依赖时)

  • 自动被VS Code识别(.venv文件夹位于项目根目录)

  • 使用全局缓存重用包,加速安装过程3

总的来说,UV提供了更现代、更快速、更集成的Python环境和包管理体验,减少了手动步骤,简化了工作流程。

Citations

  1. https://www.datacamp.com/tutorial/python-uv
  2. https://stackoverflow.com/questions/1534210/use-different-python-version-with-virtualenv
  3. https://flocode.substack.com/p/044-python-environments-again-uv
  4. https://docs.astral.sh/uv/reference/cli/
  5. https://docs.astral.sh/uv/pip/environments/
  6. https://www.reddit.com/r/learnpython/comments/1dq5zor/how_to_use_venv_in_vscode_to_run_python_scripts/
  7. https://www.youtube.com/watch?v=zgSQr0d5EVg
  8. https://treyhunner.com/2024/12/lazy-self-installing-python-scripts-with-uv/

Answer from Perplexity: pplx.ai/share

实践

cmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
pip install uv
uv python list
uv python install cpython-3.12.9
@echo 用default python 3.13跑特定script
uv run -p 3.13 python my_script.py
@echo 建立一个python 3.13的git 库
uv init -p 3.13
@echo .python-version可以直接换版本
@echo create venv
uv venv --python 3.13
@echo add package
@echo python packages will be added to pyproject toml automatically
uv add pydantic_ai
@echo dependency tree
uv tree
@echo add ruff for static check
uv add ruff --dev
@echo remove ruff
uv remove ruff --dev
@echo install tool
uv tool install ruff
@check tool list
uv tool list

Package Project

在pyproject.toml中加入

Code
1
2
[project.scripts]
ai = "ai:main"

然后用 uv build就可以打包成whl

本地就可以用uv安装whl
可以用uv tool install xxx.whl
或者 uv add xxx.whl

Uv一般流程

https://www.cnblogs.com/wang_yb/p/18635441

好的,我已经仔细阅读了你提供的这篇关于 uv 的最新文章(写于2025年4月,介绍了截至2024年12月的功能)。现在,我将根据这篇文章的内容,为你重新组织一份完整、清晰的 Python 包管理方法论,并用中文回答。


使用 uv 的现代 Python 包管理方法论 (依据提供文章)

uv 旨在提供一个快速、统一、类似 Cargo (Rust 的包管理器) 的 Python 包管理体验。以下是基于文章描述的推荐工作流程:

核心文件:

  1. pyproject.toml: 项目的 配置文件。由 用户定义和编辑,用于声明项目的元数据(名称、版本、描述等)、所需的 Python 版本以及 直接依赖项。可以区分不同的依赖组(例如开发依赖、生产依赖)。这是项目依赖的 意图 来源。
  2. uv.lock: 项目的 锁文件。由 uv 自动生成和管理,记录了项目所有依赖项(包括直接依赖和间接依赖)的 精确版本和来源。目的是确保在任何不同环境下安装依赖时都能获得完全一致的结果,保证可重复性。用户不应手动编辑此文件

方法论步骤:

1. 初始化项目 (uv init)

  • 目的: 创建一个新的 Python 项目结构,并使用 uv 进行管理。
  • 操作:
    bash
    1
    2
    uv init <你的项目名称> # 例如: uv init my-cool-project
    cd <你的项目名称>
  • 结果: uv 会创建一个包含以下基本文件的项目目录:
    • pyproject.toml: 包含项目基本信息和空的依赖列表。你需要在这里声明你的直接依赖。
    • .gitignore: 预设的 Git 忽略文件。
    • .python-version: 指定项目使用的 Python 版本。
    • hello.py / README.md: 示例文件,可以替换或删除。
    • 项目会自动初始化为 Git 仓库。

2. 同步环境与依赖 (uv sync)

  • 目的: 这是项目设置和保持环境一致性的 核心命令。它执行多项任务:
    • 查找或下载 pyproject.toml (或 .python-version) 中指定的兼容 Python 版本。
    • 在项目根目录下创建或更新虚拟环境 (.venv)。
    • 首次运行时:读取 pyproject.toml,解析所有依赖(包括间接依赖),并将精确版本信息写入 uv.lock 文件
    • 后续运行时:读取 uv.lock 文件。
    • 将虚拟环境 (.venv) 中的包与 uv.lock 文件中定义的 精确状态同步 (安装缺失的、卸载多余的、更新/降级版本不符的)。
  • 操作: 在项目根目录下运行:
    bash
    1
    uv sync
  • 关键点:
    • 新项目克隆下来后,第一步就应该是运行 uv sync 来创建环境并安装所有锁定的依赖。
    • uv.lock 文件更新后(例如,通过 git pulluv add/remove),运行 uv sync 来使本地环境与锁文件保持一致。

3. 管理依赖 (uv add / uv remove)

  • 目的: 添加或移除项目的依赖项,并自动更新配置文件、锁文件和虚拟环境。
  • 操作:

    • 添加运行时依赖:

      bash
      1
      uv add <包名> # 例如: uv add requests fastapi

      这会自动将 requestsfastapi 添加到 pyproject.toml[project.dependencies] (或者根据文章示例,可能添加到 [dependency-groups].production,具体行为需关注 uv 版本更新),更新 uv.lock,并将这些包及其依赖安装到 .venv 中。

    • 添加开发依赖 (或其他组):

      bash
      1
      uv add --group dev <包名> # 例如: uv add --group dev pytest ruff

      这会将 pytestruff 添加到 pyproject.toml[dependency-groups].dev 部分,更新 uv.lock,并将它们安装到 .venv 中。

    • 移除依赖:

      bash
      1
      uv remove <包名> # 例如: uv remove pandas

      这会从 pyproject.toml (如果存在于相应部分) 和 uv.lock 中移除 pandas 及其不再需要的间接依赖,并从 .venv 中卸载它们。

  • 关键点: 使用 uv adduv remove 是管理依赖的首选方式,因为它们能自动处理 pyproject.tomluv.lock.venv 的一致性。

4. 在虚拟环境中运行代码 (uv run)

  • 目的:uv 管理的、包含正确依赖的虚拟环境中执行 Python 脚本或任何命令。
  • 操作:
    bash
    1
    2
    3
    uv run python your_script.py
    uv run pytest # 运行安装在 dev 组的 pytest
    uv run uvicorn main:app --reload # 运行 uvicorn
  • 优势: 无需手动激活 (source .venv/bin/activate) 虚拟环境,uv run 会自动确保命令在正确的环境中执行。

5. 工作流程总结与版本控制

  1. 初始化: uv init myproject && cd myproject
  2. 添加依赖:
    • uv add requests (生产依赖)
    • uv add --group dev pytest (开发依赖)
  3. 同步/安装: (通常 uv add 会自动同步,但如果手动修改 pyproject.toml 或拉取代码后需要)uv sync
  4. 编码与测试: 编写代码,使用 uv run python main.pyuv run pytest 等运行。
  5. 提交:pyproject.tomluv.lock 文件提交到 Git。uv.lock 文件必须提交,以保证团队成员和 CI/CD 环境的一致性。.venv 目录通常添加到 .gitignore 中,不提交。
  6. 新环境设置: 其他人克隆仓库后,只需进入项目目录,运行 uv sync 即可创建完全一致的开发环境。

requirements.txt 的关系

根据这篇文章描述的 uv 工作流,pyproject.toml 用于声明直接依赖,uv.lock 用于锁定所有依赖。传统的 requirements.txt 文件在这个流程中不是必需的核心部分

  • uv 可以读取 requirements.txt 文件进行安装 (uv pip install -r requirements.txt),以兼容旧项目或特定场景。
  • uv 也可以生成 requirements.txt 格式的文件 (uv pip freeze > requirements.txt),用于需要这种格式的部署流程或工具。

但对于使用 uv 进行现代包管理的项目,推荐主要依赖 pyproject.tomluv.lock


这份基于你提供文章的方法论应该能清晰地指导你如何使用 uv 来管理你的 Python 项目。它强调了 pyproject.toml 作为用户配置入口、uv.lock 作为机器管理的锁文件、以及 uv sync 作为环境同步核心命令的角色。

https://github.com/fpgmaas/cookiecutter-uv/blob/main/Makefile

这是个带uv的cookiecutter project template


评论